package com.chengyu.core.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

@Component
public class AmapUtil {

    //在高德申请的应用Key
    @Value("${amap.key}")
    private static final String GOULD_KEY= "dc0800847e779dd8acadf3c18c9e7f11";
    //需要自己申请 key

    //申请的账户Key

    /**
     * 0.根据地址名称得到两个地址间的距离
     * @param start 起始位置
     * @param start 结束位置
     * @return 两个地址间的距离
     */
    public long getDistanceByAddress(String start, String end) {
        String startLonLat = getLonLat(start);
        String endLonLat = getLonLat(end);
        long dis = getDistance(startLonLat, endLonLat);
        return dis;
    }

    /**
     * 1.地址转换为经纬度
     * @param address 地址
     * @return 经纬度
     */
    public String getLonLat(String address) {
        // 返回输入地址address的经纬度信息, 格式是 经度,纬度
        String queryUrl = "http://restapi.amap.com/v3/geocode/geo?key="+GOULD_KEY+"&address=" + address;
        String queryResult = getResponse(queryUrl); // 高德接品返回的是JSON格式的字符串
        JSONObject job = JSONObject.parseObject(queryResult);
        JSONObject jobJSON = JSONObject
                .parseObject(job.get("geocodes").toString().substring(1, job.get("geocodes").toString().length() - 1));
        String DZ = jobJSON.get("location").toString();
//		System.out.println("经纬度：" + DZ);
        return DZ;
    }

    /**
     * 将经纬度getLng， getLat 通过getAMapByLngAndLat方法转换地址
     * @param getLng 经度
     * @param getLat 纬度
     * @return 地址名称
     * @throws Exception
     */
    public String getAMapByLngAndLat(String getLng, String getLat) throws Exception {
        String url;
        try {
            url = "http://restapi.amap.com/v3/geocode/regeo?output=JSON&location=" + getLng + "," + getLat
                    + "&key="+GOULD_KEY+"&radius=0&extensions=base";
            System.out.println(getLat);
            System.out.println(url);
            String queryResult = getResponse(url); // 高德接品返回的是JSON格式的字符串
            if (queryResult == null) {
                return "-1";
            }
            // 将获取结果转为json 数据
//            .stringToValue(queryResult)
            JSONObject obj = JSONObject.parseObject(queryResult);
            System.out.println("obj为++++++++++++++++++++++"+obj);
            if (obj.get("status").toString().equals("1")) {
                // 如果没有返回-1
                JSONObject regeocode = obj.getJSONObject("regeocode");
                if (regeocode.size() > 0) {
                    // 在regeocode中拿到 formatted_address 具体位置
                    String formatted = regeocode.get("formatted_address").toString();
                    return formatted;

                } else {
                    System.out.println("未找到相匹配的地址！");
                    return "-1";

                }
            } else {
                System.out.println("请求错误！");
                return "-1";
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "-1";
    }

    /**
     * 2.根据两个定位点的经纬度算出两点间的距离
     * @param startLonLat 起始经纬度
     * @param endLonLat 结束经纬度（目标经纬度）
     * @return 两个定位点之间的距离
     */
    private long getDistance(String startLonLat, String endLonLat) {
        // 返回起始地startAddr与目的地endAddr之间的距离，单位：米
        Long result = new Long(0);
        String queryUrl = "http://restapi.amap.com/v3/distance?key="+GOULD_KEY+"&origins=" + startLonLat + "&destination="
                + endLonLat;
        String queryResult = getResponse(queryUrl);
        JSONObject job = JSONObject.parseObject(queryResult);
        JSONArray ja = job.getJSONArray("results");
        JSONObject jobO = JSONObject.parseObject(ja.getString(0));
        result = Long.parseLong(jobO.get("distance").toString());
//		System.out.println("距离2：" + result);
        return result;
    }

    /**
     * 3.发送请求
     * @param serverUrl 请求地址
     */
    private static String getResponse(String serverUrl) {
        // 用JAVA发起http请求，并返回json格式的结果
        StringBuffer result = new StringBuffer();
        try {
            URL url = new URL(serverUrl);
            URLConnection conn = url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            in.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result.toString();
    }














//    /**日志对象*/
//    private static final Logger logger = LoggerFactory.getLogger(LocationUtils.class);
//
//    @Value("${gaode.key}")
//    private String KEY;
//
//    /**
//     * 地理编码的url
//     */
//    public final String LOCATION_URL = "https://restapi.amap.com/v3/geocode/geo?parameters";
//
//    /**
//     * 逆地理编码的url
//     */
//    public final String COUNTER_LOCATION_URL = "https://restapi.amap.com/v3/geocode/regeo?parameters";
//
//    /**
//     * 发送get请求
//     * @return
//     */
//    public JSONObject getLocation(Map<String, String> params){
//
//        JSONObject jsonObject = null;
//        CloseableHttpClient httpclient = HttpClients.createDefault();
//
//        // 创建URI对象，并且设置请求参数
//        try {
//            URI uri = getBuilderLocation(LOCATION_URL, params);
//            // 创建http GET请求
//            HttpGet httpGet = new HttpGet(uri);
//            CloseableHttpResponse response = httpclient.execute(httpGet);
//
//            // 判断返回状态是否为200
//            jsonObject = getLocation(response);
//            httpclient.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return jsonObject;
//    }
//
//    /**
//     * 根据地址获取到经纬度
//     * @param response
//     * @return
//     */
//    private static JSONObject getLocation(CloseableHttpResponse response) throws Exception{
//        JSONObject geocode = null;
//        // 判断返回状态是否为200
//        if (response.getStatusLine().getStatusCode() == 200) {
//            String content = EntityUtils.toString(response.getEntity(), "UTF-8");
//            logger.info("调用高德地图接口返回的结果为:{}",content);
//            JSONObject jsonObject = (JSONObject) JSONObject.parse(content);
//            JSONArray geocodes = (JSONArray) jsonObject.get("geocodes");
//            geocode = (JSONObject) geocodes.get(0);
//
//            logger.info("返回的结果为:{}",JSONObject.toJSONString(geocode));
//        }
//        return geocode;
//    }
//
//    /**
//     * 地理编码封装URI
//     * @param url
//     * @param params
//     * @return
//     * @throws Exception
//     */
//    private URI getBuilderLocation(String url, Map<String, String> params) throws Exception{
//        // 详细地址
//        String address = params.get("address");
//        String city = params.get("city");
//
//        URIBuilder uriBuilder = new URIBuilder(url);
//        // 公共参数
//        uriBuilder.setParameter("key", KEY);
//        uriBuilder.setParameter("address", address);
//        uriBuilder.setParameter("city", city);
//
//        logger.info("请求的参数为:{}", JSONObject.toJSONString(uriBuilder));
//        URI uri = uriBuilder.build();
//        return uri;
//    }
//
//    /**
//     * 逆地理编码
//     * @return
//     */
//    public JSONObject getCounterLocation(Map<String, String> params){
//
//        JSONObject jsonObject = null;
//        CloseableHttpClient httpclient = HttpClients.createDefault();
//
//        // 创建URI对象，并且设置请求参数
//        try {
//            URI uri = getBuilderCounterLocation(COUNTER_LOCATION_URL, params);
//            // 创建http GET请求
//            HttpGet httpGet = new HttpGet(uri);
//            CloseableHttpResponse response = httpclient.execute(httpGet);
//
//            // 判断返回状态是否为200
//            jsonObject = getCounterLocation(response);
//            httpclient.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return jsonObject;
//    }
//
//    /**
//     * 逆地理编码封装URI
//     * @param url
//     * @param params
//     * @return
//     * @throws Exception
//     */
//    private URI getBuilderCounterLocation(String url, Map<String, String> params) throws Exception{
//        // 详细地址
//        String location = params.get("location");
//
//        URIBuilder uriBuilder = new URIBuilder(url);
//        // 公共参数
//        uriBuilder.setParameter("key", KEY);
//        uriBuilder.setParameter("location", location);
//
//        logger.info("请求的参数为:{}", JSONObject.toJSONString(uriBuilder));
//        URI uri = uriBuilder.build();
//        return uri;
//    }
//
//    /**
//     * 根据地址获取到经纬度
//     * @param response
//     * @return
//     */
//    private static JSONObject getCounterLocation(CloseableHttpResponse response) throws Exception{
//        JSONObject regeocode = null;
//        // 判断返回状态是否为200
//        if (response.getStatusLine().getStatusCode() == 200) {
//            String content = EntityUtils.toString(response.getEntity(), "UTF-8");
//            logger.info("调用高德地图接口返回的结果为:{}",content);
//            JSONObject jsonObject = (JSONObject) JSONObject.parse(content);
//            regeocode =  (JSONObject)jsonObject.get("regeocode");
//
//            logger.info("返回的结果为:{}",JSONObject.toJSONString(regeocode));
//        }
//        return regeocode;
//    }

}

